package daos;

import java.util.List;
import java.util.Vector;

import org.hibernate.Query;
import org.hibernate.Session;

import Partido.PartidoSimple;
import equipos.Equipo;

/**
 * TODO: description
 */
public class DAO {

    public List<PartidoSimple> obtenerPartidosSimplesEntreEquipos(final Session session, final Equipo equipo1,
            final Equipo equipo2) {
        Query partidos = session.createQuery("from PartidoSimple p where ((p.equipo1 = :equipo1 "
                + "and p.equipo2 = :equipo2)" + "or (p.equipo1 = :equipo2 " + "and p.equipo2 = :equipo1))");

        partidos.setParameter("equipo1", equipo1);
        partidos.setParameter("equipo2", equipo2);
        return partidos.list();
    }

    public List<Equipo> obtenerEquipos(final Session session) {
        Query query = session.createQuery("from Equipo");

        return query.list();
    }

    public List<PartidoSimple> obtenerEmpatesEntreDosEquipos(final Session session, final Equipo equipo1,
            final Equipo equipo2) {
        Query empates = session.createQuery("from PartidoSimple p where ((p.equipo1 = :equipo1 "
                + "and p.equipo2 = :equipo2) or (p.equipo1 = :equipo2 and p.equipo2 = :equipo1))"
                + "and p.campoDeGolesEquipo1 = p.campoDeGolesEquipo2");
        empates.setCacheable(true);
        empates.setParameter("equipo1", equipo1);
        empates.setParameter("equipo2", equipo2);
        return empates.list();
    }

    public List<PartidoSimple> obtenerEmpatesDeUnaListaDePartidosSimples(final List<PartidoSimple> partidos) {
        List<PartidoSimple> empates = new Vector<PartidoSimple>();
        for (PartidoSimple partido : partidos) {
            if (partido.getCampoDeGolesEquipo1() == partido.getCampoDeGolesEquipo2()) {
                empates.add(partido);
            }
        }
        return empates;
    }

    public List<PartidoSimple> partidosGanadosEquipo1(final Session session, final Equipo equipo1, final Equipo equipo2) {
        Query partidosGanadosPorEquipo1 = session.createQuery("from PartidoSimple p where ((p.equipo1 = :equipo1 "
                + "and p.equipo2 = :equipo2)" + "or (p.equipo1 = :equipo2 " + "and p.equipo2 = :equipo1))"
                + "and p.equipoGanador = :equipo1)");
        partidosGanadosPorEquipo1.setCacheable(true);
        partidosGanadosPorEquipo1.setParameter("equipo1", equipo1);
        partidosGanadosPorEquipo1.setParameter("equipo2", equipo2);

        return partidosGanadosPorEquipo1.list();
    }

    public List<PartidoSimple> partidosGanadosEquipo2(final Session session, final Equipo equipo1, final Equipo equipo2) {
        Query q = session.createQuery("from PartidoSimple p where ((p.equipo1 = :equipo1 "
                + "and p.equipo2 = :equipo2)" + "or (p.equipo1 = :equipo2 " + "and p.equipo2 = :equipo1))"
                + "and p.equipoGanador = :equipo2)");
        q.setCacheable(true);
        q.setParameter("equipo1", equipo1);
        q.setParameter("equipo2", equipo2);

        return q.list();
    }

    public List<PartidoSimple> empatesEquipos(final Session session, final Equipo equipo1, final Equipo equipo2) {
        Query q = session.createQuery("from PartidoSimple p where ((p.equipo1 = :equipo1 "
                + "and p.equipo2 = :equipo2)" + "or (p.equipo1 = :equipo2 " + "and p.equipo2 = :equipo1))"
                + "and p.equipoGanador = null)");
        q.setCacheable(true);
        q.setParameter("equipo1", equipo1);
        q.setParameter("equipo2", equipo2);

        return q.list();
    }

}
